package com.ada.spark.broadcast

import org.apache.spark.{SparkConf, SparkContext}

/**
  * 广播变量用来高效分发较大的对象。
  * 向所有工作节点发送一个较大的只读值，以供一个或多个Spark操作使用。
  * 比如，如果你的应用需要向所有节点发送一个较大的只读查询表，甚至是机器学习算法中的一个很大的特征向量，广播变量用起来都很顺手。
  * 在多个并行操作中使用同一个变量，但是 Spark会为每个任务分别发送。
  *
  * 使用广播变量的过程如下：
  * (1) 通过对一个类型 T 的对象调用 SparkContext.broadcast 创建出一个 Broadcast[T] 对象。任何可序列化的类型都可以这么实现。
  * (2) 通过 value 属性访问该对象的值(在 Java 中为 value() 方法)。
  * (3) 变量只会被发到各个节点一次，应作为只读值处理(修改这个值不会影响到别的节点)。
  */
object BroadcastTest {
    def main(args: Array[String]): Unit = {
        //获取Spark配置信息并创建与spark的连接
        val sparkConf = new SparkConf().setMaster("local[*]").setAppName("BroadcastTest")
        val sc = new SparkContext(sparkConf)

        val broadcastVar = sc.broadcast(Array(1, 2, 3))

        println(broadcastVar.value.mkString(","))
    }
}
